﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdmLaboratorios.DAO;
using AdmLaboratorios.DTO;
using System.Data.SqlClient;
using System.Data;

namespace AdmLaboratorios.Business
{
    public static class InformesRecepcion
    {
        static InformeRecepcionDAO daoIR = DAOFactory.Get<InformeRecepcionDAO>();
        static InformeRecepcionItemDAO daoItem = DAOFactory.Get<InformeRecepcionItemDAO>();
        static StockDAO daoStock = DAOFactory.Get<StockDAO>();

        //public static List<InformeRecepcionDTO> GetOpByPartner(PartnerDTO partner)
        //{
        //    string where = string.Format("IdPartner = {0} and Activo = true", partner.Id);
        //    return daoIR.ReadAll(where);
        //}


        public static List<InformeRecepcionDTO> GetIRsActiveByPartner(int partnerId)
        {
            string where = string.Format("IdPartner = {0} AND Estado = '{1}' Activo = 'TRUE'", 
                partnerId, eInformeRecepcionEstado.APROBADO.ToString());

            return daoIR.ReadAll(where);
        }

        public static List<InformeRecepcionDTO> GetByOP(OrdenProduccionDTO op, eInformeRecepcionEstado estado)
        {
            string where = string.Format("IdOrdenProduccion = {0} AND Estado = '{1}' AND Activo = 'TRUE'",
                op.Id, estado.ToString());

            return daoIR.ReadAll(where);
        }


        public static List<InformeRecepcionItemDTO> GetItemsByIR(int idIR)
        {
            string where = string.Format("IdInformeRecepcion = {0} AND Activo = 'TRUE'", idIR);
            return daoItem.ReadAll(where);
        }

        public static void ApproveIR(int idIR)
        {
            try 
	        {	  
                using (SqlTransaction tran = daoItem.IniciarTransaccion())
                {
                    var Ir = daoIR.Read(idIR);

                    Ir.Estado = eInformeRecepcionEstado.APROBADO.ToString();
                    Ir.IdAprobador = BusinessHelper.Usuario.UsuarioDTO.Id;

                    daoIR.Update(Ir, Ir.Id, tran);
                    daoIR.Log(LogDTO.eAcciones.Modificacion, "Aprobando Informe de Recepción", Ir.Id, tran);

                    //
                    var items = daoItem.ReadAll("IdInformeRecepcion=" + Ir.Id);
                    Stock.AddToStock(Ir, items, tran);
                    daoIR.CommitTransaccion(tran);
                }
	        }
	        catch (Exception ex)
	        {
                throw new Exception("ApproveIR", ex);
	        }
        }

        public static IR Update(IR ir)
        {
            List<InformeRecepcionItemDTO> aux = new List<InformeRecepcionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoIR.IniciarTransaccion())
                {
                    daoIR.Update(ir.InformeRecepcion, ir.InformeRecepcion.Id, tran);

                    //Elimino los existentes.
                    daoItem.Delete("IdInformeRecepcion=" + ir.InformeRecepcion.Id, tran);

                    foreach (InformeRecepcionItemDTO item in ir.Items)
                    {
                        item.Id = 0;
                        item.IdInformeRecepcion = ir.InformeRecepcion.Id;
                        var itemAux = daoItem.Create(item, tran);

                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item de la IR nro: " + item.IdInformeRecepcion, itemAux.Id, tran);
                        aux.Add(itemAux);
                    }

                    daoIR.Log(LogDTO.eAcciones.Alta, "Alta de IR", ir.InformeRecepcion.Id, tran);
                    daoIR.CommitTransaccion(tran);

                    ir.Items = aux;
                    return ir;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static IR Save(IR ir)
        {
            List<InformeRecepcionItemDTO> aux = new List<InformeRecepcionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoIR.IniciarTransaccion())
                {
                    var cabecera = daoIR.Create(ir.InformeRecepcion, tran);

                    foreach (InformeRecepcionItemDTO item in ir.Items)
                    {
                        InformeRecepcionItemDTO itemAux = new InformeRecepcionItemDTO();

                        item.Activo = true;
                        item.IdInformeRecepcion = cabecera.Id;
                        itemAux = daoItem.Create(item, tran);

                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item de la IR nro: " + cabecera.Id, itemAux.Id, tran);
                        aux.Add(itemAux);
                    }

                    daoIR.Log(LogDTO.eAcciones.Alta, "Alta de IR", cabecera.Id, tran);
                    daoIR.CommitTransaccion(tran);

                    ir.Items = aux;
                    return ir;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Save", ex);
            }
        }

        public static DataTable Consulta(string filtro, string estado)
        {
            if (filtro.Trim() != string.Empty)
                return daoIR.Consulta(string.Format("(A.NroComprobante LIKE '%{0}%' OR B.Nombre LIKE '%{0}%' OR C.NumeroOP LIKE '%{0}%') AND A.Estado = '{1}'",
                    filtro, estado.ToString()));
            else
                return daoIR.Consulta(string.Format("A.Estado = '{0}'", estado.ToString()));
        }

        public static DataTable SinOp()
        {
            return daoIR.Consulta("A.IdOrdenProduccion IS NULL");
        }

        public static DataTable SinOp(int idPartner)
        {
            return daoIR.Consulta("A.IdOrdenProduccion IS NULL AND A.IdPartner = " + idPartner.ToString());
        }

        public static IR Get(int idIR)
        {
            return new IR() 
            { 
                InformeRecepcion = daoIR.Read(idIR), 
                Items = daoItem.ReadAll("IdInformeRecepcion=" + idIR) 
            };
        }

        internal static void SetStock(InformeRecepcionItemDTO item, StockDTO stock, SqlTransaction tran)
        {
            try
            {
                item.IdStock = stock.Id;
                daoItem.Update(item, item.Id, tran);
                daoItem.Log(LogDTO.eAcciones.Modificacion, "Relación a Stock. IR nro: " + item.IdInformeRecepcion, 
                    item.Id, "IdStock", "", stock.Id.ToString(), tran);
            }
            catch (Exception ex)
            {
                throw new Exception("SetStock", ex);
            }
        }

        public static void SetOP(OrdenProduccionDTO Op, List<int> ids)
        {
            try
            {
                using (SqlTransaction tran = daoIR.IniciarTransaccion())
                {
                    foreach (int idIr in ids)
                    {
                        var ir = daoIR.Read(idIr);
                        ir.IdOrdenProduccion = Op.Id;

                        daoIR.Update(ir, ir.Id, tran);
                        daoIR.Log(LogDTO.eAcciones.Alta, "Modificacion de la OP relacionada a la IR.", idIr, tran);
                    }
                    daoIR.CommitTransaccion(tran);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("SetOP", ex);
            }
        }

        public static IR Clonar(int id)
        {
            List<InformeRecepcionItemDTO> aux = new List<InformeRecepcionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoIR.IniciarTransaccion())
                {
                    var irOriginal = Get(id);
                    var cabecera = irOriginal.InformeRecepcion;
                    var items = irOriginal.Items;

                    cabecera.Id = 0;
                    cabecera.Activo = true;
                    cabecera.ArchivoPDF = null;
                    cabecera.Estado = eInformeRecepcionEstado.EN_REVISION.ToString();
                    cabecera.IdAprobador = null;
                    cabecera.IdOperador = BusinessHelper.Usuario.UsuarioDTO.Id;
                    cabecera.Activo = true;
                    cabecera.Fecha = DateTime.Today;

                    cabecera = daoIR.Create(cabecera, tran);

                    foreach (InformeRecepcionItemDTO item in items)
                    {
                        InformeRecepcionItemDTO itemAux = new InformeRecepcionItemDTO();

                        item.Id = 0;
                        item.Activo = true;
                        item.IdInformeRecepcion = cabecera.Id;
                        item.IdStock = null;

                        itemAux = daoItem.Create(item, tran);

                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item del IR nro: " + cabecera.Id, itemAux.Id, tran);

                        aux.Add(itemAux);
                    }

                    daoIR.Log(LogDTO.eAcciones.Alta, "Alta de IR", cabecera.Id, tran);

                    daoIR.CommitTransaccion(tran);

                    IR ir = new IR();
                    ir.InformeRecepcion = cabecera;
                    ir.Items = aux;

                    return ir;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
